package br.com.agregador.managedbean;

import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import org.primefaces.model.DualListModel;

import br.com.agregador.entity.Categoria;
import br.com.agregador.entity.Cidade;
import br.com.agregador.entity.Consumidor;
import br.com.agregador.servico.CategoriaServico;
import br.com.agregador.servico.CidadeServico;
import br.com.agregador.servico.ConsumidorServico;
import br.com.agregador.servico.excecao.EmailException;

import com.ocpsoft.pretty.faces.annotation.URLAction;
import com.ocpsoft.pretty.faces.annotation.URLMapping;
import com.ocpsoft.pretty.faces.annotation.URLMappings;

@URLMappings(mappings={
		  @URLMapping(id = "cadastroConsumidor", pattern = "/usuario/cadastro", viewId = "/consumidor/cadastro.jsf"),
		  @URLMapping(id = "atualizarConsumidor", pattern = "/usuario/atualizar/#{consumidorManagedBean.idConsumidor}/", viewId = "/consumidor/atualizacao.jsf"),
		  @URLMapping(id = "descadastroConsumidor", pattern = "/usuario/descadastro", viewId = "/consumidor/descadastro.jsf")
		})
@ManagedBean(name="consumidorManagedBean")
@ViewScoped
public class ConsumidorManagedBean extends BaseBean {

	private static final long serialVersionUID = 1L;
	
	@ManagedProperty(name="categoriaServico",value="#{categoriaServico}")
	private CategoriaServico categoriaServico;
	
	@ManagedProperty(name="cidadeServico",value="#{cidadeServico}")
	private CidadeServico cidadeServico;
	
	@ManagedProperty(name="consumidorServico",value="#{consumidorServico}")
	private ConsumidorServico consumidorServico;
	
	private List<Cidade> cidadesFonte;
	private List<Cidade> cidadesAlvo;
	private List<Categoria> categoriasFonte;
	private List<Categoria> categoriasAlvo;
	private DualListModel<Cidade> dualListCidades;
	private DualListModel<Categoria> dualListCategorias;
	private Consumidor consumidor;
	private boolean exibirForm;
	private String emailDescadastro;
	private String idConsumidor;
	
	public ConsumidorManagedBean(){		
		cidadesAlvo = new ArrayList<Cidade>();
		cidadesFonte = new ArrayList<Cidade>();
		categoriasAlvo = new ArrayList<Categoria>();
		categoriasFonte = new ArrayList<Categoria>();		
		consumidor = new Consumidor();
	}
	
	@URLAction(mappingId = "cadastroConsumidor", onPostback=false)
	public void iniciarDadosCadastro(){		
		carregarCategorias();
		carregarCidades();
		dualListCategorias = new DualListModel<>(categoriasFonte, categoriasAlvo);
		dualListCidades = new DualListModel<>(cidadesFonte, cidadesAlvo);
		setExibirForm(true);
	}
	
	public void salvar(){				
		consumidor.getCategorias().addAll(dualListCategorias.getTarget());
		consumidor.getCidades().addAll(dualListCidades.getTarget());
		try {
			consumidorServico.salvar(consumidor);
			addMensagem(FacesMessage.SEVERITY_INFO, "Cadastro", "Cadastro realizado com sucesso!");
			consumidor = new Consumidor();
			setExibirForm(false);
		} catch (EmailException e) {
			addMensagem(FacesMessage.SEVERITY_ERROR, "Cadastro", "O e-mail informado já foi cadastrado");
		}		
	}
	
	@URLAction(mappingId = "atualizarConsumidor", onPostback=false)
	public void iniciarDadosAtualizar(){
		consumidor = consumidorServico.recuperarConsumidor(new Integer(idConsumidor));
		if(consumidor == null){
			addMensagem(FacesMessage.SEVERITY_ERROR, "Atualização", "Não foi possível recuperar as informações solicitadas");
			setExibirForm(false);
		}else{
			setExibirForm(true);
			carregarCategorias();
			carregarCidades();
			List<Categoria> catRemovidas = new ArrayList<Categoria>();
			List<Cidade> cidRemovidas = new ArrayList<Cidade>();
			for(Categoria c : categoriasFonte){
				for(Categoria ct : consumidor.getCategorias()){
					if(c.equals(ct)){
						catRemovidas.add(c);
					}
				}
			}
			for(Cidade c : cidadesFonte){
				for(Cidade ci : consumidor.getCidades()){
					if(c.equals(ci)){
						cidRemovidas.add(ci);
					}
				}
			}
			cidadesFonte.removeAll(cidRemovidas);
			categoriasFonte.removeAll(catRemovidas);
			categoriasAlvo.addAll(consumidor.getCategorias());
			cidadesAlvo.addAll(consumidor.getCidades());
			consumidor.getCategorias().clear();
			consumidor.getCidades().clear();
			dualListCategorias = new DualListModel<>(categoriasFonte, categoriasAlvo);
			dualListCidades = new DualListModel<>(cidadesFonte, cidadesAlvo);
		}
	}
	
	public void atuliazar(){
		consumidor.getCategorias().addAll(dualListCategorias.getTarget());
		consumidor.getCidades().addAll(dualListCidades.getTarget());
		consumidorServico.atualizar(consumidor);
		addMensagem(FacesMessage.SEVERITY_INFO, "Atualização", "Atualização realizada com sucesso!");
		setExibirForm(false);
		consumidor = new Consumidor();
	}
	
	public void redirecionar(){
		redirecionar(PAG_INDEX);
	}
	
	public void descadastrar(){
		try {
			consumidorServico.excluir(emailDescadastro);
			addMensagem(FacesMessage.SEVERITY_INFO, "Descadastro", "Descadastro realizado com sucesso!");
			emailDescadastro = "";
		} catch (EmailException e) {
			addMensagem(FacesMessage.SEVERITY_ERROR, "Descadastro", "O e-mail informado não existe");
		}
	}
	
	public void carregarCidades(){
		cidadesFonte = cidadeServico.recuperarCidades(true);
	}
	
	public void carregarCategorias(){
		categoriasFonte = categoriaServico.recuperarCategorias(true);
	}

	// ========================== GET/SET ===================================== //
	
	public CategoriaServico getCategoriaServico() {
		return categoriaServico;
	}

	public void setCategoriaServico(CategoriaServico categoriaServico) {
		this.categoriaServico = categoriaServico;
	}

	public CidadeServico getCidadeServico() {
		return cidadeServico;
	}

	public void setCidadeServico(CidadeServico cidadeServico) {
		this.cidadeServico = cidadeServico;
	}

	public List<Cidade> getCidadesFonte() {
		return cidadesFonte;
	}

	public void setCidadesFonte(List<Cidade> cidadesFonte) {
		this.cidadesFonte = cidadesFonte;
	}

	public List<Cidade> getCidadesAlvo() {
		return cidadesAlvo;
	}

	public void setCidadesAlvo(List<Cidade> cidadesAlvo) {
		this.cidadesAlvo = cidadesAlvo;
	}

	public List<Categoria> getCategoriasFonte() {
		return categoriasFonte;
	}

	public void setCategoriasFonte(List<Categoria> categoriasFonte) {
		this.categoriasFonte = categoriasFonte;
	}

	public List<Categoria> getCategoriasAlvo() {
		return categoriasAlvo;
	}

	public void setCategoriasAlvo(List<Categoria> categoriasAlvo) {
		this.categoriasAlvo = categoriasAlvo;
	}

	public DualListModel<Cidade> getDualListCidades() {
		return dualListCidades;
	}

	public void setDualListCidades(DualListModel<Cidade> dualListCidades) {
		this.dualListCidades = dualListCidades;
	}

	public DualListModel<Categoria> getDualListCategorias() {
		return dualListCategorias;
	}

	public void setDualListCategorias(DualListModel<Categoria> dualListCategorias) {
		this.dualListCategorias = dualListCategorias;
	}

	public Consumidor getConsumidor() {
		return consumidor;
	}

	public void setConsumidor(Consumidor consumidor) {
		this.consumidor = consumidor;
	}

	public boolean isExibirForm() {
		return exibirForm;
	}

	public void setExibirForm(boolean exibirForm) {
		this.exibirForm = exibirForm;
	}

	public ConsumidorServico getConsumidorServico() {
		return consumidorServico;
	}

	public void setConsumidorServico(ConsumidorServico consumidorServico) {
		this.consumidorServico = consumidorServico;
	}

	public String getEmailDescadastro() {
		return emailDescadastro;
	}

	public void setEmailDescadastro(String emailDescadastro) {
		this.emailDescadastro = emailDescadastro;
	}

	public String getIdConsumidor() {
		return idConsumidor;
	}

	public void setIdConsumidor(String idConsumidor) {
		this.idConsumidor = idConsumidor;
	}	
}
